import axios from "axios";
import useUserStore from "@/store/user";
let userStoreCache: any = null;

const request = axios.create({
    // baseURL: "http://10.131.185.174:8000",
    baseURL: "http://192.168.0.153:8000",
    // baseURL: "http://192.168.1.15:8000",
    timeout: 10000
});


// 请求拦截器
request.interceptors.request.use((config:any) => {
    if (!userStoreCache) {
        userStoreCache = useUserStore();
    }
    const token = config.url?.includes('/login/refresh_token') ? userStoreCache.refresh_token : userStoreCache.access_token;
    if (token) {
        config.headers.Authorization = `Bearer ${token}`;
    } else {
        console.warn('请求未包含认证令牌，可能导致授权失败:', config.url);
    }
    console.log('发送请求:', config.method?.toUpperCase(), config.url, config.params || config.data);
    return config;
});

// 错误消息映射
const ERROR_MESSAGE_MAP: { [key: number]: string } = {
    200: '成功',
    201: '创建成功',
    202: '请求已接受，但未处理完成',
    204: '没有内容',
    301: '永久重定向',
    302: '临时重定向',
    303: '浏览器请求其他地址',
    304: '未修改',
    400: '签名无效',
    401: '未授权',
    403: '无效权限',
    404: '未找到',
    405: '方法不允许',
    406: '不接受',
    408: '请求超时',
    413: '请求实体过大',
    414: '请求URI过长',
    426: '需要升级',
    429: '请求过多',
    431: '请求头字段过大',
    500: '内部服务器错误',
    503: '服务不可用'
};

// 刷新令牌
async function refreshTokenAndRetry(error: any, retryCount = 0): Promise<any> {
    console.log('尝试刷新令牌并重试请求，重试次数:', retryCount);
    if (retryCount > 1) {
        console.warn('刷新令牌失败次数超过限制，执行登出操作');
        await userStoreCache.userlogout();
        return ;
    }
    try {
        console.log('正在刷新令牌...');
        const res: any = await request.post('/login/refresh_token');
        if (res.code === 200) {
            console.log('刷新令牌成功，继续执行原请求');
            userStoreCache.access_token = res.access_token;
            sessionStorage.setItem("access_token", res.access_token);
            return request(error.config);
        } else {
            console.error('刷新令牌失败:', res);
            await userStoreCache.userlogout();
            return ;
        }
    } catch (refreshError) {
        console.error('刷新令牌发生异常:', refreshError);
        await userStoreCache.userlogout();
        return ;
    }
}

// 响应拦截器
request.interceptors.response.use(res => {
    console.log('接收响应:', res.config.url, res.data);
    
    // 判断响应类型
    if (Array.isArray(res.data)) {
        // 处理数组类型的直接响应
        console.log('接收到数组类型的响应');
        return {
            code: 200,
            data: res.data
        };
    } else if (typeof res.data === 'object' && res.data !== null) {
        if (res.data.code == 200) {
            return res.data;
        } else if ('code' in res.data) {
            console.error('响应状态码不为200:', res.config.url, res.data);
            return Promise.reject(res.data.msg || '请求失败');
        } else {
            // 没有code字段但是是对象的响应
            return {
                code: 200,
                data: res.data
            };
        }
    } else {
        // 其他类型的响应
        return {
            code: 200,
            data: res.data
        };
    }
}, async (error: any) => {
    console.error('请求发生错误:', error.config?.url, error);
    
    // 检查是否有响应
    if (!error.response) {
        console.error('请求没有响应，可能是网络问题或服务器未运行');
        return Promise.reject({ status: 0, msg: '无法连接到服务器，请检查网络连接' });
    }
    
    const status = error.response.status;
    console.error('错误状态码:', status, '错误详情:', error.response.data);
    
    if (status === 401 && !error.config.url?.includes('/login') && !error.config.url?.includes('/login/refresh_token')) {
        return refreshTokenAndRetry(error, error.retryCount ? error.retryCount + 1 : 1);
    }
    
    const msg: string = ERROR_MESSAGE_MAP[status] || '网络错误';
    return Promise.reject({ status, msg, details: error.response.data });
});


export default request;